shortcut: Change the API for creating shortcuts
authorBenjamin Otte <otte@redhat.com>
Sat, 18 Aug 2018 18:01:43 +0000 (20:01 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 26 Mar 2020 03:14:27 +0000 (23:14 -0400)
When creating shortcuts, there almost always are a trigger and an action
available for use. So make gtk_shortcut_new() take those as arguments.

Also add gtk_shortcut_new_with_arguments() so people can easily pass
those in, too.

demos/gtk-demo/shortcut_triggers.c
docs/reference/gtk/gtk4-sections.txt
gtk/gtklabel.c
gtk/gtkshortcut.c
gtk/gtkshortcut.h
gtk/gtkwidget.c
gtk/gtkwindow.c

index 5f06cbe520cb27e4205902673d514f26881fd410..d5b59c3de8a173428bc5b09dfd2da82fe2e747b3 100644 (file)
@@ -76,9 +76,8 @@ do_shortcut_triggers (GtkWidget *do_widget)
           gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), GTK_SHORTCUT_SCOPE_GLOBAL);
           gtk_widget_add_controller (row, controller);
 
-          shortcut = gtk_shortcut_new ();
-          gtk_shortcut_set_trigger (shortcut, shortcuts[i].create_trigger_func());
-          gtk_shortcut_set_action (shortcut, gtk_callback_action_new (shortcut_activated, row, NULL));
+          shortcut = gtk_shortcut_new (shortcuts[i].create_trigger_func(),
+                                       gtk_callback_action_new (shortcut_activated, row, NULL));
           gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
         }
     }
index 28cd3c9339864a584a03c25789c26e03ade34246..002f112f2fb00b8ff50c5cf39db095033293dfd9 100644 (file)
@@ -6067,6 +6067,7 @@ gtk_shortcut_action_get_type
 <TITLE>GtkShortcut</TITLE>
 GtkShortcut
 gtk_shortcut_new
+gtk_shortcut_new_with_arguments
 gtk_shortcut_get_trigger
 gtk_shortcut_set_trigger
 gtk_shortcut_get_action
index 90dc9013cf852050b14cf6906e81705408a7d036..049927ef2cce2cd8dc882166fa71aa5cee4434ca 100644 (file)
@@ -1822,9 +1822,8 @@ gtk_label_setup_mnemonic (GtkLabel *label)
       priv->mnemonic_controller = gtk_shortcut_controller_new ();
       gtk_event_controller_set_propagation_phase (priv->mnemonic_controller, GTK_PHASE_CAPTURE);
       gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), GTK_SHORTCUT_SCOPE_MANAGED);
-      shortcut = gtk_shortcut_new ();
-      gtk_shortcut_set_trigger (shortcut, gtk_mnemonic_trigger_new (priv->mnemonic_keyval));
-      gtk_shortcut_set_action (shortcut, gtk_mnemonic_action_new ());
+      shortcut = gtk_shortcut_new (gtk_mnemonic_trigger_new (priv->mnemonic_keyval),
+                                   gtk_mnemonic_action_new ());
       gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), shortcut);
       gtk_widget_add_controller (GTK_WIDGET (label), priv->mnemonic_controller);
       g_object_unref (shortcut);
index 4c7ec59859a4235e439e8db698daa12d0e9b4571..6a7ff1a14840fd480ca1f6c2b5e76fc30def1956 100644 (file)
@@ -200,15 +200,81 @@ gtk_shortcut_init (GtkShortcut *self)
 
 /**
  * gtk_shortcut_new:
+ * @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
+ * @action: (transfer full) (allow-none): The action that will be activated upon
+ *    triggering
  *
- * Creates a new empty #GtkShortcut that never triggers and activates nothing.
+ * Creates a new #GtkShortcut that is triggered by @trigger and then activates
+ * @action.
  *
  * Returns: a new #GtkShortcut
  **/
 GtkShortcut *
-gtk_shortcut_new (void)
+gtk_shortcut_new (GtkShortcutTrigger *trigger,
+                  GtkShortcutAction  *action)
 {
-  return g_object_new (GTK_TYPE_SHORTCUT, NULL);
+  GtkShortcut *shortcut;
+
+  shortcut = g_object_new (GTK_TYPE_SHORTCUT,
+                           "action", action,
+                           "trigger", trigger,
+                           NULL);
+
+  if (trigger)
+    gtk_shortcut_trigger_unref (trigger);
+  if (action)
+    gtk_shortcut_action_unref (action);
+
+  return shortcut;
+}
+
+/**
+ * gtk_shortcut_new_with_arguments: (skip)
+ * @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
+ * @action: (transfer full) (allow-none): The action that will be activated upon
+ *    triggering
+ * @format_string: (allow-none): GVariant format string for arguments or %NULL for
+ *     no arguments
+ * @...: arguments, as given by format string.
+ *
+ * Creates a new #GtkShortcut that is triggered by @trigger and then activates
+ * @action with arguments given by @format_string.
+ *
+ * Returns: a new #GtkShortcut
+ **/
+GtkShortcut *
+gtk_shortcut_new_with_arguments (GtkShortcutTrigger *trigger,
+                                 GtkShortcutAction  *action,
+                                 const gchar        *format_string,
+                                 ...)
+{
+  GtkShortcut *shortcut;
+  GVariant *args;
+
+  if (format_string)
+    {
+      va_list valist;
+      va_start (valist, format_string);
+      args = g_variant_new_va (format_string, NULL, &valist);
+      va_end (valist);
+    }
+  else
+    {
+      args = NULL;
+    }
+
+  shortcut = g_object_new (GTK_TYPE_SHORTCUT,
+                           "action", action,
+                           "arguments", args,
+                           "trigger", trigger,
+                           NULL);
+
+  if (trigger)
+    gtk_shortcut_trigger_unref (trigger);
+  if (action)
+    gtk_shortcut_action_unref (action);
+
+  return shortcut;
 }
 
 /**
index 78bc871bf37ae2da98dc6ff962e757f0c7df56ce..77c89754a263e86162c59040a2c8c207273add4f 100644 (file)
@@ -30,7 +30,13 @@ GDK_AVAILABLE_IN_ALL
 G_DECLARE_FINAL_TYPE (GtkShortcut, gtk_shortcut, GTK, SHORTCUT, GObject)
 
 GDK_AVAILABLE_IN_ALL
-GtkShortcut *   gtk_shortcut_new                                (void);
+GtkShortcut *   gtk_shortcut_new                                (GtkShortcutTrigger     *trigger,
+                                                                 GtkShortcutAction      *action);
+GDK_AVAILABLE_IN_ALL
+GtkShortcut *   gtk_shortcut_new_with_arguments                 (GtkShortcutTrigger     *trigger,
+                                                                 GtkShortcutAction      *action,
+                                                                 const gchar            *format_string,
+                                                                 ...);
 
 GDK_AVAILABLE_IN_ALL
 GtkShortcutTrigger *
index e710789b72b087d1d8913278c9666d47e36881bc..c4766a68485d739ec7eb5de71085e630a9d4132d 100644 (file)
@@ -4367,9 +4367,8 @@ gtk_widget_class_add_binding (GtkWidgetClass  *widget_class,
 
   g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
 
-  shortcut = gtk_shortcut_new ();
-  gtk_shortcut_set_trigger (shortcut, gtk_keyval_trigger_new (keyval, mods));
-  gtk_shortcut_set_action (shortcut, gtk_callback_action_new (func, NULL, NULL));
+  shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
+                               gtk_callback_action_new (func, NULL, NULL));
   if (format_string)
     {
       va_list args;
@@ -4417,9 +4416,8 @@ gtk_widget_class_add_binding_signal (GtkWidgetClass  *widget_class,
   g_return_if_fail (g_signal_lookup (signal, G_TYPE_FROM_CLASS (widget_class)));
   /* XXX: validate variant format for signal */
 
-  shortcut = gtk_shortcut_new ();
-  gtk_shortcut_set_trigger (shortcut, gtk_keyval_trigger_new (keyval, mods));
-  gtk_shortcut_set_action (shortcut, gtk_signal_action_new (signal));
+  shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
+                               gtk_signal_action_new (signal));
   if (format_string)
     {
       va_list args;
@@ -4466,9 +4464,8 @@ gtk_widget_class_add_binding_action (GtkWidgetClass  *widget_class,
   g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
   /* XXX: validate variant format for action */
 
-  shortcut = gtk_shortcut_new ();
-  gtk_shortcut_set_trigger (shortcut, gtk_keyval_trigger_new (keyval, mods));
-  gtk_shortcut_set_action (shortcut, gtk_action_action_new (action_name));
+  shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
+                               gtk_action_action_new (action_name));
   if (format_string)
     {
       va_list args;
index 83a8bd8cfae53c72cfae47608087b4267fad607f..5101d3d31a99f31f901a1f9391878cca86e04ead 100644 (file)
@@ -563,12 +563,11 @@ add_tab_bindings (GtkWidgetClass   *widget_class,
 {
   GtkShortcut *shortcut;
 
-  shortcut = gtk_shortcut_new ();
-  gtk_shortcut_set_trigger (shortcut,
-                            gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_Tab, modifiers),
-                                                         gtk_keyval_trigger_new (GDK_KEY_KP_Tab, modifiers)));
-  gtk_shortcut_set_action (shortcut, gtk_signal_action_new ("move-focus"));
-  gtk_shortcut_set_arguments (shortcut, g_variant_new_tuple ((GVariant*[1]) { g_variant_new_int32 (direction) }, 1));
+  shortcut = gtk_shortcut_new_with_arguments (
+                 gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_Tab, modifiers),
+                                              gtk_keyval_trigger_new (GDK_KEY_KP_Tab, modifiers)),
+                 gtk_signal_action_new ("move-focus"),
+                 "(i)", direction);
 
   gtk_widget_class_add_shortcut (widget_class, shortcut);
 
@@ -1766,9 +1765,8 @@ gtk_window_init (GtkWindow *window)
   controller = gtk_shortcut_controller_new ();
   gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
 
-  shortcut = gtk_shortcut_new ();
-  gtk_shortcut_set_trigger (shortcut, gtk_keyval_trigger_new (MENU_BAR_ACCEL, 0));
-  gtk_shortcut_set_action (shortcut, gtk_callback_action_new (gtk_window_activate_menubar, NULL, NULL));
+  shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (MENU_BAR_ACCEL, 0),
+                               gtk_callback_action_new (gtk_window_activate_menubar, NULL, NULL));
   gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
   gtk_event_controller_set_name (controller, "gtk-window-menubar-accel");
   gtk_widget_add_controller (widget, controller);